/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.treepoke.util.reportes;

import com.treepoke.util.base.TPBaseDTO;
import com.treepoke.util.properties.TPConstant;
import java.io.File;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.*;
import net.sf.jasperreports.engine.export.ooxml.JRDocxExporter;
import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter;

/**
 * @fecha 09/07/2013
 * @author dpulido
 */
public class ProcesarReporte<T extends TPBaseDTO> {

    public static ProcesarReporte instance = null;
    private static final String EXTENSION_REPORTE = ".jasper";    
    public static final int TIPO_FORMATO_PDF = 1;
    public static final int TIPO_FORMATO_XLS = 2;
    public static final int TIPO_FORMATO_XLSX = 3;
    public static final int TIPO_FORMATO_DOC = 4;
    public static final int TIPO_FORMATO_CSV = 5;

    public static ProcesarReporte getInstance() {

        if (instance == null) {
            instance = new ProcesarReporte();
        }

        return instance;
    }

    public ProcesarReporte() {

    }
    
    public String generarReporte(Collection<T> lstDatos, String nombreReporte, String nombreAplicacion, int tipoReporte) throws Exception {

        JRDataSource reportSource = new JRBeanCollectionDataSource(lstDatos);
        Map<String, Object> param = new HashMap<String, Object>();
        param.put("RUTA_IMAGEN",  TPConstant.getIMG_LOGO_CRCC());
        String rutaReporteApp = TPConstant.getCARPETA_REPORTES_JASPER() + File.separator +
                nombreAplicacion + File.separator;
        String reporteFuente = rutaReporteApp + nombreReporte + EXTENSION_REPORTE;
        String rutaGenerados = rutaReporteApp + TPConstant.getCARPETA_GENERADOS() + File.separator;
        JasperPrint jasperPrint = JasperFillManager.fillReport(reporteFuente, param, reportSource);
        return exportarReporte(tipoReporte, nombreReporte, rutaGenerados, jasperPrint);
    }

    public String exportarReporte(int tipoReporte, String nombreReporte, String rutaGenerados, JasperPrint jasperPrint) throws JRException {

        JRExporter exporter = null;
        String prefijoRutaGenerado = rutaGenerados + nombreReporte + "_" + System.currentTimeMillis(); 
        String archivoGenerado = "";

        switch (tipoReporte) {
            
            case TIPO_FORMATO_PDF:
                exporter = new JRPdfExporter();
                archivoGenerado = prefijoRutaGenerado + ".pdf";
                exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, archivoGenerado);
                exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
                break;

            case TIPO_FORMATO_XLS:
                exporter = new JRXlsExporter();
                archivoGenerado = prefijoRutaGenerado + ".xls";
                exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, archivoGenerado);
                exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
                exporter.setParameter(JRExporterParameter.IGNORE_PAGE_MARGINS, Boolean.TRUE);
                exporter.setParameter(JExcelApiExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE);
                exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
                exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
                exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);
                break;

            case TIPO_FORMATO_XLSX:
                exporter = new JRXlsxExporter();
                archivoGenerado = prefijoRutaGenerado + ".xlsx";
                exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, archivoGenerado);                
                exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
                exporter.setParameter(JRExporterParameter.IGNORE_PAGE_MARGINS, Boolean.TRUE);
                exporter.setParameter(JExcelApiExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE);
                exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
                exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
                exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);
                break;

            case TIPO_FORMATO_CSV:
                exporter = new JRCsvExporter();
                archivoGenerado = prefijoRutaGenerado + ".csv";
                exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, archivoGenerado);
                exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);

                break;

            case TIPO_FORMATO_DOC:
                exporter = new JRDocxExporter();
                archivoGenerado = prefijoRutaGenerado + ".doc";
                exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, archivoGenerado);
                exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
                break;

        }
        exporter.exportReport();
        
        return archivoGenerado;

    }


}
